﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using EntitiesAndMappings.Entities;
using ProyectoActivos.Daos;
using ProyectoActivos.Util;
using ProyectoActivos.Validate;

namespace ProyectoActivos.Forms.Operaciones
{
    public partial class FrmEditarIngreso : Form,IValidateForm
    {
        public bool CerroSinAccion { get; set; }

        private Ingreso ingreso;

        private bool _valido;

        public FrmEditarIngreso(Ingreso ingreso)
        {
            InitializeComponent();
            this.ingreso = ingreso;
            if (this.ingreso.Id == 0)
            {
                this.ingreso.Items = new List<DetalleIngreso>();
            }
            _valido = true;
            dGridDetalleIngreso.AutoGenerateColumns = false;
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            _valido = true;
            errorProvider.Clear();
            FormsAssert.AssertComboBoxSelected(cmbArticulo, errorProvider, this);
            FormsAssert.AssertTextBoxOnlyPositiveNumbers(txtCantidad, errorProvider, this);
            FormsAssert.AssertComboBoxSelected(cmbCondicionEquipo, errorProvider, this);
            if (ingreso.Items.Any(item => item.Articulo.Equals(cmbArticulo.SelectedItem)))
            {
                MessageBox.Show(@"El artículo ya se agregó al detalle, para modificarlo, elimínelo del detalle y vuelva a elegirlo especificando las propiedades deseadas");
                return;
            }
            ActionExecutor.Execute(this, delegate
            {
                ingreso.Items.Add(new DetalleIngreso
                {
                    Articulo = (Articulo)cmbArticulo.SelectedItem,
                    Cantidad = int.Parse(txtCantidad.Text),
                    CondicionEquipo = (CondicionEquipo)cmbCondicionEquipo.SelectedItem,
                    Partes = txtPartes.Text,
                    Consumibles = txtConsumibles.Text,
                    ObservacionesMantenimiento = txtObservacion.Text
                });
                dGridDetalleIngreso.DataSource = null;
                dGridDetalleIngreso.DataSource = ingreso.Items;
            });
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (dGridDetalleIngreso.CurrentRow != null)
            {
                var detalleIngreso = (DetalleIngreso)dGridDetalleIngreso.CurrentRow.DataBoundItem;
                ingreso.Items.Remove(detalleIngreso);
                dGridDetalleIngreso.DataSource = null;
                dGridDetalleIngreso.DataSource = ingreso.Items;
            }
            else
            {
                MessageBox.Show(@"Debe seleccionar un elemento");
            }
        }

        private void radOpcion1_CheckedChanged(object sender, EventArgs e)
        {
            SeleccionaAlmacen(true);
        }

        private void radOpcion2_CheckedChanged(object sender, EventArgs e)
        {
            SeleccionaAlmacen(false);
        }

        private void SeleccionaAlmacen(bool activo)
        {
            cmbAlmacen.Enabled = activo;
            cmbProyecto.Enabled = !activo;
            cmbLote.Enabled = !activo;
            cmbLugar.Enabled = !activo;
            txtPartes.Enabled = !activo;
            txtConsumibles.Enabled = !activo;
            txtObservacion.Enabled = !activo;
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            CerroSinAccion = false;

            _valido = true;
            errorProvider.Clear();
            FormsAssert.AssertComboBoxSelected(cmbMovimiento, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtNroGuia, 20, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtNroFactura, 20, errorProvider, this);

            if (radOpcion1.Checked)
            {
                FormsAssert.AssertComboBoxSelected(cmbAlmacen, errorProvider, this);
            }
            else
            {
                FormsAssert.AssertComboBoxSelected(cmbProyecto, errorProvider, this);
                FormsAssert.AssertComboBoxSelected(cmbLote, errorProvider, this);
                FormsAssert.AssertComboBoxSelected(cmbLugar, errorProvider, this);
            }

            FormsAssert.AssertTextBoxNotEmptyAndSize(txtUbicacion, 50, errorProvider, this);   
            ActionExecutor.Execute(this, delegate
            {
                ingreso.Fecha = datFecha.Value.Date;
                ingreso.TipoMovimiento = cmbMovimiento.SelectedItem as TipoMovimiento;
                ingreso.Proveedor = cmbProveedor.SelectedItem as Proveedor;
                if (ingreso.Proveedor.Id == 0)
                {
                    ingreso.Proveedor = null;
                }
                ingreso.NumeroFactura = txtNroFactura.Text;
                ingreso.NumeroGuia = txtNroGuia.Text;
                if (radOpcion1.Checked)
                {
                    ingreso.Almacen = cmbAlmacen.SelectedItem as Almacen;
                    ingreso.Proyecto = null;
                    ingreso.Lote = null;
                    ingreso.Lugar = null;
                }
                else
                {
                    ingreso.Almacen = null;
                    ingreso.Proyecto = cmbProyecto.SelectedItem as Proyecto;
                    ingreso.Lote = cmbLote.SelectedItem as Lote;
                    ingreso.Lugar = cmbLugar.SelectedItem as Lugar;
                }
                ingreso.Ubicacion = txtUbicacion.Text;
                var ingresoDao = new IngresoDAO();
                ingresoDao.Update(ingreso);
                Close();
            });
        }

        private void FrmEditarIngreso_Load(object sender, EventArgs e)
        {
            _valido = true;

            IList<TipoMovimiento> listadoTipoMovimiento;
            IList<Proveedor> listadoProveedor;
            IList<Almacen> listadoAlmacen;
            IList<Proyecto> listadoProyecto;
            IList<Lote> listadoLote;
            IList<Lugar> listadoLugar;
            IList<Articulo> listadoArticulo;
            IList<CondicionEquipo> listadoCondicionEquipo;

            ActionExecutor.Execute(this, delegate
            {
                var tipoMovimientoDAO = new TipoMovimientoDAO();
                listadoTipoMovimiento = tipoMovimientoDAO.ListarTipoMovimientoEntradaActivos();
                cmbMovimiento.DataSource = listadoTipoMovimiento;

                var proveedorDAO = new ProveedorDAO();
                listadoProveedor = proveedorDAO.ObtenerActivos();
                listadoProveedor = ComboUtils.AgregarAlInicio(new Proveedor { Ruc = string.Empty, RazonSocial = " Ninguno -" },
                                                      listadoProveedor);
                cmbProveedor.DataSource = listadoProveedor;

                var almacenDAO = new AlmacenDAO();
                listadoAlmacen = almacenDAO.ObtenerActivos();
                cmbAlmacen.DataSource = listadoAlmacen;

                var proyectoDAO = new EntidadGenericaDAO<Proyecto>();
                listadoProyecto = proyectoDAO.ObtenerActivos();
                cmbProyecto.DataSource = listadoProyecto;

                var loteDAO = new EntidadGenericaDAO<Lote>();
                listadoLote = loteDAO.ObtenerActivos();
                cmbLote.DataSource = listadoLote;

                var lugarDAO = new EntidadGenericaDAO<Lugar>();
                listadoLugar = lugarDAO.ObtenerActivos();
                cmbLugar.DataSource = listadoLugar;

                var articuloDAO = new ArticuloDAO();
                listadoArticulo = articuloDAO.ObtenerActivos();
                cmbArticulo.DataSource = listadoArticulo;

                var condicionEquipoDAO = new EntidadGenericaDAO<CondicionEquipo>();
                listadoCondicionEquipo = condicionEquipoDAO.ObtenerActivos();
                cmbCondicionEquipo.DataSource = listadoCondicionEquipo;

            });
            if (ingreso.Id != 0)
            {
                datFecha.Value = ingreso.Fecha;
                txtNroGuia.Text = ingreso.NumeroGuia;
                txtNroFactura.Text = ingreso.NumeroFactura;
                txtUbicacion.Text = ingreso.Ubicacion;
                dGridDetalleIngreso.DataSource = ingreso.Items;
                cmbMovimiento.SelectedIndex = ComboUtils.GetIndice(cmbMovimiento, ingreso.TipoMovimiento.Id);
                cmbProveedor.SelectedIndex = ComboUtils.GetIndice(cmbProveedor, ingreso.Proveedor.Id);
                if (ingreso.Almacen!=null)
                {
                    radOpcion1.Checked = true;
                    radOpcion2.Checked = false;
                    cmbAlmacen.SelectedIndex = ComboUtils.GetIndice(cmbAlmacen, ingreso.Almacen.Id);
                    SeleccionaAlmacen(true);
                }
                else
                {
                    radOpcion1.Checked = false;
                    radOpcion2.Checked = true;
                    cmbProyecto.SelectedIndex = ComboUtils.GetIndice(cmbProyecto, ingreso.Proyecto.Id);
                    cmbLote.SelectedIndex = ComboUtils.GetIndice(cmbLote, ingreso.Lote.Id);
                    cmbLugar.SelectedIndex = ComboUtils.GetIndice(cmbLugar, ingreso.Lugar.Id);
                    SeleccionaAlmacen(false);
                }
            }
        }

        public void Invalid()
        {
            _valido = false;
        }

        public bool IsValid()
        {
            return _valido;
        }
    }
}
